package com.hedl.practice.diyJava.reflex.field_access;

import java.lang.reflect.Modifier;

public class Field {
    /**
     * Class类提供了以下几个方法来获取字段：
     *          Field getField(name)：根据字段名获取某个public的field（包括父类）
     *          Field getDeclaredField(name)：根据字段名获取当前类的某个field,如果是private权限也是可以访问的（不包括父类）
     *          Field[] getFields()：获取所有public的field（包括父类）
     *          Field[] getDeclaredFields()：获取当前类的所有field（不包括父类)
     *
     * 一个Field对象包含了一个字段的所有信息：
     *          getName()：返回字段名称，例如，"name"；
     *          getType()：返回字段类型，也是一个Class实例，例如，String.class；
     *          getModifiers()：返回字段的修饰符，它是一个int，不同的bit表示不同的含义。
     *
     */
    public static void main(String[] args) {

        Class std = Student.class;

        try {
            // 获取public字段"score":
            System.out.println("获取public字段\"score\"---->"+std.getField("score"));

            //获取继承的public字段"name":
            System.out.println("获取继承的public字段\"name\"---->"+std.getField("name"));

            //获取private字段"grade":
            System.out.println("获取private字段\"grade\"---->"+std.getDeclaredField("grade"));
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        }


        //用反射获取字段的信息
        try {
            java.lang.reflect.Field f = String.class.getDeclaredField("value");
            System.out.println(f.getName());
            System.out.println(f.getType());
            int m = f.getModifiers();
            System.out.println("是否是常量类型："+Modifier.isFinal(m));
            System.out.println("是否是私有类型："+Modifier.isPrivate(m));
            System.out.println("是否是受保护的类型："+Modifier.isProtected(m));
            System.out.println("是否是公开类型："+Modifier.isPublic(m));
            System.out.println("是否是静态类型："+Modifier.isStatic(m));

        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        }
    }
}

class Student extends Person{
    public int score;
    private int grade;
}

class Person{
    public String name;
}
